package search

// DefaultMatcher MARK 小写开头 这是一个不公开的类
type DefaultMatcher struct{} //MARK 类的本身,没有object field 也要定义;go这边 类名和文件名 没关系!!!

// init registers the default matcher with the program.
func init() { //MARK 所有導入過這個包的 都會在main之前 執行init
	//这个不行是因为Search是要转成接口Matcher 调用Search, Search声明的时候 写的是指针, 所以这边不给值, 反过来却可以(Search声明值就2个都行)
	//var matcher DefaultMatcher//MARK 这样是直接得到: 一个defaultMatcher类型的实例(值); &matcher可以拿到它的指针;
	matcher := new(DefaultMatcher) //MARK 这样是得到:一个defaultMatcher类型的实例(值)的指针;
	Register("default", matcher)
}

// Search MARK 这里用实例或者实例的指针调都行; 这里声明也 不论 [值] 还是 [指针]
func (m DefaultMatcher) Search(_ *Feed, _ string) ([]*Result, error) { //MARK 第一个括号是 说自己属于这个类型的值(实例),

	return nil, nil
}

/**
MARK 关于指针
new(type) 得到指针，指向type的nil值，就是新建出来的状态，是开始而不是空
var a type 得到的是 指向type的nil值，就是新建出来的状态，是开始而不是空
&a是对值取指针
*（&a） 是拿到指针的值
*/

/***
MARK 关于类
本体是 type xxxx struct{} 定义的, 和文件名无关
类的实例(这里叫值)
1.作为参数传出去的时候, 接受方如果声明入参是这个类实现的接口, 我传  本类的值(实例) 或者 值的指针都可以
2.作为类实现的接口的方法, 方法声明(第一个括号) 里面 写 本类的值(实例) 或者 值的指针都可以, 调用的时候 也是 本类的值(实例).Search 或者 值的指针.Search都可以
注意: 其他都是值和值的指针一样, 唯一不行的是 声明的是值的指针, 把值转接口来调方法, 比如 :
func (m *DefaultMatcher) Search是实现Matcher接口的方法
((Matcher)defaultMatcher实例).Search报错
*/
